package com.coder.rental.utils;

import lombok.Data;
import lombok.experimental.Accessors;
import org.apache.poi.ss.formula.functions.T;

/**
 * 统一返回结果
 */
@Data
@Accessors(chain = true)
public class Result<T> {

    private Integer code;

    private String message;

    private Boolean success;

    private T data;


    /**
     * 创建一个表示成功操作的结果对象
     * 此方法用于生成一个泛型Result对象，该对象表示操作成功状态它将结果的成功标志设置为true，
     * 结果代码设置为表示成功的代码，并提供一个表示操作成功的默认消息
     *
     * @param <T> Result对象的泛型参数，表示结果对象可以携带的数据类型
     * @return 返回一个表示操作成功的Result对象
     */
    public static <T> Result<T> success(){
        return new Result<T>().setSuccess(true)
                .setCode(ResultCode.SUCCESS).setMessage("操作成功");
    }

    /**
     * 创建一个表示操作成功的Result对象
     * 该方法用于在操作成功时，封装成功数据和信息
     *
     * @param <T> 泛型参数，表示可以封装任何类型的对象
     * @param data 操作成功后需要封装的数据
     * @return 返回一个表示操作成功的Result对象，包含成功数据
     */
    public static <T> Result<T> success(T data){
        // 创建并配置一个成功的Result对象
        return new Result<T>().setSuccess(true)
                .setCode(ResultCode.SUCCESS)
                .setMessage("操作成功").setData(data);
    }

    /**
     * 创建一个表示操作失败的通用结果对象
     * 此方法用于在操作失败时，返回一个默认的Result对象，表示操作失败的状态和信息
     *
     * @param <T> 泛型参数，表示结果对象中数据的类型，此处并不指定具体类型
     * @return 返回一个泛型类型为T的Result对象，该对象表示操作失败的状态和信息
     */
    public static <T> Result<T> fail(){
        // 创建并返回一个Result对象，设置其成功状态为false，错误代码为ERROR，消息为"操作失败"
        return new Result<T>().setSuccess(false)
                .setCode(ResultCode.ERROR).setMessage("操作失败");
    }


}
